package es.javamyadmin.dao;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;

import es.javamyadmin.modelo.Databases;

/**
 * Clase con los distintos metodos para trabajar con las BASES DE DATOS de MySQL.
 * @author Hector Delgado
 * @author Emilio Javier Castillo
 * @version 1.0
 */
public class DatabasesDAO {
	
	Connection conexion = null;
	Statement estamento = null;
	PreparedStatement preparada = null;
	ResultSet resultado = null;
	
	String rutaDescarga = "/Users/Hector/Downloads/";
	String rutaMySqlDump = "/Applications/MAMP/Library/bin/mysqldump";
	String rutaMySqlBin = "/Applications/MAMP/Library/bin/";
	
	
	/**
	 * Metodo para leer las Bases de Datos
	 * @param user String con el usuario para hacer la conexion a MySQL.
	 * @param pass String con el password para hacer la conexion a MySQL.
	 * @param host String con el servidor donde se encuentra MySQL.
	 * @param port String con el puerto del servidor de MySQL.
	 * @return
	 */
	public Collection<Databases> leerDatabases(String user, String pass, String host, String port){
		Collection<Databases> lista = new ArrayList<Databases>();
		try {
			Class.forName("com.mysql.jdbc.Driver");                
      	    conexion=DriverManager.getConnection("jdbc:mysql://"+host+":"+port+"/", user, pass);
      	    
      	    PreparedStatement pstm = conexion.prepareStatement("SHOW DATABASES");
      	    resultado = pstm.executeQuery();
			while(resultado.next()){
				Databases db = new Databases();
				db.setNombreBD(resultado.getString(1));
				lista.add(db);
			}
		} catch(SQLException | ClassNotFoundException ex){
			ex.printStackTrace();
		} finally {
			cerrarConexion();
		}
		
		return lista;		
	}
	
	/**
	 * Metodo para exportar una Base de datos
	 * @param user String con el usuario para hacer la conexion a MySQL.
	 * @param pass String con el password para hacer la conexion a MySQL.
	 * @param host String con el servidor donde se encuentra MySQL.
	 * @param port String con el puerto del servidor de MySQL.
	 * @param bd String con la Base de datos a exportar
	 * @return
	 */
	public Boolean exportarBD(String user, String pass, String host, String port, String bd){
		
		Boolean error = false;
		
		String ruta = rutaMySqlDump;
		
		String dirDescarga = rutaDescarga;
		
		String nomArchivo =bd+".sql";
		
		String comando = ruta+" -u "+user+" -p"+pass+" "+bd;
		
		try {
		      Process p = Runtime.getRuntime().exec(comando);
		 
		      InputStream is = p.getInputStream();
		      FileOutputStream fos = new FileOutputStream(dirDescarga+nomArchivo);
		      byte[] buffer = new byte[1000];
		 
		      int leido = is.read(buffer);
		      while (leido > 0) {
		         fos.write(buffer, 0, leido);
		         leido = is.read(buffer);
		      }
		 
		      fos.close();
		 
		 } catch (Exception e) {
		      e.printStackTrace();
		      error= true;
		 }
		
		return error;
	}
	
	/**
	 * Metodo para importar una Base de Datos.
	 * @param user String con el usuario para hacer la conexion a MySQL.
	 * @param pass String con el password para hacer la conexion a MySQL.
	 * @param host String con el servidor donde se encuentra MySQL.
	 * @param port String con el puerto del servidor de MySQL.
	 * @param bd String con la Base de Datos a importar.
	 * @param rutaArchivo String con la ruta del archivo para la importacion.
	 * @return
	 */
	public Boolean importarBD(String user, String pass, String host, String port, String bd, String rutaArchivo){
		
		Boolean error = false;
		
		String ruta = rutaMySqlBin;
		
		try {
		      Process p = Runtime
		            .getRuntime()
		            .exec(ruta+"mysql -u "+user+" -p"+pass+" "+bd);
		 
		      OutputStream os = p.getOutputStream();
		      FileInputStream fis = new FileInputStream(rutaArchivo);
		      byte[] buffer = new byte[1000];
		 
		      int leido = fis.read(buffer);
		      while (leido > 0) {
		         os.write(buffer, 0, leido);
		         leido = fis.read(buffer);
		      }
		 
		      os.flush();
		      os.close();
		      fis.close();
		 
		   } catch (Exception e) {
		      e.printStackTrace();
		      error= true;
		   }
		
		return error;
	}
	
	/**
	 * Metodo para cerrar la conexion.
	 */
	public void cerrarConexion(){
		if(resultado != null){
			try {
				resultado.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			resultado = null;
		}
		if(estamento != null){
			try {
				estamento.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			estamento = null;
		}
		if(preparada != null){
			try {
				preparada.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			preparada = null;
		}
		if(conexion != null){
			try {
				conexion.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			conexion = null;
		}
	}
		
}
